package com.proxy.callbackFilter;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;

public class Test {

	public static void main(String[] args) {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(ConcreteClassNoInterface.class);
		CallbackFilter filter = new ConcreteClassCallbackFilter();
		enhancer.setCallbackFilter(filter);

		Callback interceptor = new ConcreteClassInterceptor();// (1)方法拦截器。
		Callback noOp = NoOp.INSTANCE;// (2)这个NoOp表示no operator，即什么操作也不做，代理类直接调用被代理的方法不进行拦截。
		Callback fixedValue = new ConcreteClassFixedValue();// (3)表示锁定方法返回值，无论被代理类的方法返回什么值，回调方法都返回固定值。
		Callback[] callbacks = new Callback[] { interceptor, noOp, fixedValue };
		enhancer.setCallbacks(callbacks);
		ConcreteClassNoInterface proxyObject = (ConcreteClassNoInterface) enhancer.create();

		System.out.println("*** NoOp Callback ***");
		proxyObject.getConcreteMethodA("abcde");

		System.out.println("*** MethodInterceptor Callback ***");
		proxyObject.getConcreteMethodB(1);

		System.out.println("*** FixedValue Callback ***");
		int fixed1 = proxyObject.getConcreteMethodFixedValue(128);
		System.out.println("fixedValue1:"+fixed1);
		int fixed2 = proxyObject.getConcreteMethodFixedValue(256);
		System.out.println("fixedValue2:"+fixed2);
	}

}
